#include "includes.h"
#include <signal.h>
#include <assert.h>


#define TTY_NODE_SIZE				64
#define SERVER_MOD_MASK				0x01
#define CLIENT_MOD_MASK				0x02
#define BUFF_SIZE					2048

#define PRINT_LOG(fd,fmt,args...) \
do{ 	\
	char log_buff[1024]={0}; \
	uint16_t log_len=0; \
	printf(fmt,##args); \
	if(fd > 0 ) {\
		log_len = snprintf(log_buff,1024,fmt,##args); \
		write(fd,log_buff,log_len); \
	} \
}while(0)

const char *usage={
"usage:\n" \
"\t-h\t help information\n" \
"\t-v\t software version\n" \
"\t-p\t tty node.                 ex:-p /dev/ttyS1,115200\n" \
"\t-s\t server\n" \
"\t-c\t client\n" \
"\t-i\t interval time(s).         ex:-i 1\n" \
"\t-t\t total packages.           ex:-t 100\n" \
"\t-m\t max send bytes(<= 1024).  ex:-m 1024\n" \
};

struct device_t{
	const char 		*name;
	char 			tty[TTY_NODE_SIZE+1];
	int 			baudrate;
	uint32_t        time;					//发送的间隔时间
	uint32_t        total;					//总共要发送的包数
	uint32_t        count;					//发送计数
	uint8_t 		mode;					//模式，0客户端模式，1服务端模式
	uint32_t        max_size;				//一次传输的最大传输能力
	struct serial_t serial_dev;
	uint8_t			recv_buff[BUFF_SIZE+1];				//接收数据的buff
	int				recv_len;							//接收到的字节长度
	uint32_t		recv_total;							//接收到的总字节长度
	uint8_t			tran_buff[BUFF_SIZE+1];				//传输数据的buff
	int				tran_len;							//传输到的字节长度
	uint32_t 		tran_total;							//传输总的字节长度
	uint32_t		error_len;							//单次传输时发送错误的字节数量。
	uint32_t		error_total;						//总的错误长度，是发送长度和接收长度，每个字节比较的结果。
	uint32_t		error_cnt;							//出现过错误的次数。
	const char 		*log_file;							//输出的log文件
	int				fd;									//打开的log文件的文件描述符
};

static struct device_t device={0};
volatile sig_atomic_t flag = 0;
char trans_data[2][1025]={
{"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \
"\0" \
},
{"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55" \
"\0" \
},
};
/*
char trans_data[2][1025]={
{"\x02" \
"I am happy to join with you today in what will go down in history as the greatest demonstration for freedom in the history of our nation.\n" \
"Five score years ago, a great American, in whose symbolic shadow we stand today, signed the Emancipation Proclamation. This momentous decree came as a great beacon light of hope to millions of Negro slaves who had been seared in the flames of withering injustice. It came as a joyous daybreak to end the long night of bad captivity.\n" \
"But one hundred years later, the Negro still is not free. One hundred years later, the life of the Negro is still sadly crippled by the manacles of segregation and the chains of discrimination. One hundred years later, the Negro lives on a lonely island of poverty in the midst of a vast ocean of material prosperity. One hundred years later, the Negro is still languished in the corners of American society and finds himself an exile in his own land. And so we've come here today to dramatize a shameful condition.\n" \
"In a sense we've come to our natio\n" \
"\x03\x00"},
{"\x02" \
"But we refuse to believe that the bank of justice is bankrupt. We refuse to believe that there are insufficient funds in the great vaults of opportunity of this nation. And so, we've come to cash this check, a check that will give us upon demand the riches of freedom and the security of justice.\n" \
"We have also come to this hallowed spot to remind America of the fierce urgency of Now. This is no time to engage in the luxury of cooling off or to take the tranquilizing drug of gradualism. Now is the time to make real the promises of democracy. Now is the time to rise from the dark and desolate valley of segregation to the sunlit path of racial justice. Now is the time to lift our nation from the quicksands of racial injustice to the solid rock of brotherhood. Now is the time to make justice a reality for all of God's children.\n" \
"It would be fatal for the nation to overlook the urgency of the moment. This sweltering summer of the Negro's legitimate discontent will not pass until there is an invigorating autumn of \n" \
"\x03\x00"},
};
*/

static int get_ttynode(const char *arg,char *tty,uint32_t *baudrate)
{
	char *p=NULL;
	int len=0;
	p = strchr(arg,',');
	if(p == NULL){
		return -1;
	}
	len = p-arg;
	if(len < TTY_NODE_SIZE){
		strncpy(tty,arg,len);
	}
	p++;
	if(*p=='\0'){
		return -1;
	}
	*baudrate = atoi(p);
	return 0;
}

static void app_exit_handler(int sig)
{
	flag = 1;
}

/**
 * @brief 对两个数组进行比较，返回两个数组中相同数据的数量。
 * 
 * @param arg1 
 * @param arg2 
 * @param length 
 * @return uint32_t 
 */
static uint32_t compare_array(uint8_t *arg1, uint8_t *arg2,uint32_t length)
{
	uint32_t i=0,len=0;
	for(i=0;i<length;i++){
		if(arg1[i] == arg2[i]){
			len++;
		}
	}
	return len;
}


int main( int argc , char * argv[] )
{
	int i=0,restart=0;
	int len = 0, index = 0;
	uint8_t	 buff[BUFF_SIZE+1];				//传输数据的buff
	for(i=1;i<argc;i++){
		if(!strcmp(argv[i],"-v")){
			printf("Version:%s  Build time:%s\n",VERSION_NUMBER,COMPILE_TIME);
			goto exit;
		}else if(!strcmp(argv[i],"-h")){
			printf("Version:%s  Build time:%s\n",VERSION_NUMBER,COMPILE_TIME);
			printf("%s\n",usage);
			goto exit;
		}else if(!strcmp(argv[i],"-p")){
			i++;
			if(argv[i] != NULL){
				if(get_ttynode(argv[i],device.tty,&device.baudrate) < 0){
					device.tty[0] = '\0';
				}
			}	
		}else if(!strcmp(argv[i],"-s")){
			device.mode = SERVER_MOD_MASK;
		}else if(!strcmp(argv[i],"-c")){
			device.mode = CLIENT_MOD_MASK;
		}else if(!strcmp(argv[i],"-cs") || !strcmp(argv[i],"-sc")){
			device.mode = (CLIENT_MOD_MASK | SERVER_MOD_MASK);
		}else if(!strcmp(argv[i],"-i")){
			i++;
			device.time = atoi(argv[i]);
		}else if(!strcmp(argv[i],"-t")){
			i++;
			device.total = atoi(argv[i]);
		}else if(!strcmp(argv[i],"-m")){
			i++;
			device.max_size = atoi(argv[i]);
		}else if(!strcmp(argv[i],"-f")){
			i++;
			device.log_file = argv[i];
		}else if(!strcmp(argv[i],"-l")){
			printf("trans_data(%ld,%ld)\n",strlen(trans_data[0]),strlen(trans_data[1]));
			goto exit;
		}else{
			printf("Version:%s  Build time:%s\n",VERSION_NUMBER,COMPILE_TIME);
			printf("Invalid parameter\n");
			printf("%s\n",usage);
			goto exit;
		}
	}
	if((strlen(device.tty) == 0)
		||(device.baudrate == 0)){
		printf("Serial port configuration error\n");
		goto exit;
	}
	if(device.mode == 0){
		printf("Invalid parameter\n");
		printf("%s\n",usage);
		goto exit;
	}
	device.total = device.total > 0 ? device.total : 10;
	device.time	 = device.time > 0 ? device.time : 1;
	device.max_size = (device.max_size > 1024) || (device.max_size == 0) ? 1024 : device.max_size;

	if(device.log_file != NULL){
		device.fd = open(device.log_file,O_WRONLY|O_CREAT|O_TRUNC, 0777);
		if(device.fd < 0){
			printf("Open or Create <%s> fail!\n",device.log_file);
			goto exit;
		}
	}else{
		device.fd = -1;
	}

	if(serial_device_init(&device.serial_dev,device.tty,device.baudrate,NULL)<0){
		printf("Open<%s> fail!\n",device.tty);
		goto exit;
	}

	signal(SIGINT, app_exit_handler);
	if( device.mode == SERVER_MOD_MASK){
		/*作为服务端时会将收到的数据进行回传。*/
		PRINT_LOG(device.fd,"-------------------------------------------------------------------------\n");
		PRINT_LOG(device.fd,"COM:%s,%d;\tmode:0x%02x;\r\n",device.tty,device.baudrate,device.mode);
		PRINT_LOG(device.fd,"-------------------------------------------------------------------------\n");
		device.recv_total = 0;
		memset(device.recv_buff,0,sizeof(device.recv_buff));
		while(!flag){
			len = 0;
			index = 0;
			while(1){
				len = sync_read_serial(&device.serial_dev,&device.recv_buff[index],BUFF_SIZE,1);
				if(len <= 0){  /*错误,超时*/
					device.recv_len = index;
					break;
				}else{
					len = (index + len)>BUFF_SIZE ? BUFF_SIZE - index : len;
					index += len;
				}
			}
			if(device.recv_len > 0){
				if(NULL == strstr(device.recv_buff,"\x04\x04\x04\x04\x04")){
					if(!restart){
						restart = 1;
						PRINT_LOG(device.fd,"number \t\t receive(bytes) \t send(bytes)\n");
					}
					device.recv_total += device.recv_len;
					write_serial(&device.serial_dev,device.recv_buff, device.recv_len);
					device.count++;
					PRINT_LOG(device.fd,"[%6d]\t%4d Bytes\t\t%4d Bytes\n",device.count,device.recv_len,device.recv_len);
				}else{
					restart = 0;
					PRINT_LOG(device.fd,"- - - - - - - - - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - \n");
					PRINT_LOG(device.fd,"Receive Total Byte Length:%d Bytes\n\n",device.recv_total);
					PRINT_LOG(device.fd,"-------------------------------------------------------------------------\n");
					PRINT_LOG(device.fd,"COM:%s,%d;\tmode:0x%02x;\r\n",device.tty,device.baudrate,device.mode);
					PRINT_LOG(device.fd,"-------------------------------------------------------------------------\n");
					device.count = 0;
					device.recv_total = 0;
				}
			}
		}
		PRINT_LOG(device.fd,"-------------------------------------------------------------------------\n");
		PRINT_LOG(device.fd,"Receive Total Byte Length:%d Bytes\n\n",device.recv_total);
	}else{
		device.error_cnt = 0;
		PRINT_LOG(device.fd,"-------------------------------------------------------------------------\n");
		PRINT_LOG(device.fd,"COM:%s,%d;\ttime:%d;\ttotal:%d;\tmax size:%d;\tmode:0x%02x;\r\n",device.tty,device.baudrate,device.time,device.total,device.max_size,device.mode);
		PRINT_LOG(device.fd,"-------------------------------------------------------------------------\n");
		PRINT_LOG(device.fd,"number \t\t send(bytes) \t receive(bytes) \t error(bytes)\n");
		while(!flag){
			memset(device.tran_buff,0,sizeof(device.tran_buff));
			strncpy(device.tran_buff,trans_data[device.count % 2],sizeof(device.tran_buff));
			device.tran_len = strlen(device.tran_buff);
			device.tran_len = device.tran_len > device.max_size ? device.max_size : device.tran_len;
			device.tran_total += device.tran_len;
			write_serial(&device.serial_dev,device.tran_buff, device.tran_len);
			usleep(200000);
			len = 0;
			index = 0;
			memset(device.recv_buff,0,sizeof(device.recv_buff));
			while(1){
				len = sync_read_serial(&device.serial_dev,&buff,BUFF_SIZE,device.time);
				if(len <= 0){  /*错误,超时*/
					device.recv_len = index;
					break;
				}else{
					len = (index + len)>BUFF_SIZE ? BUFF_SIZE - index : len;
					memcpy(&device.recv_buff[index],buff,len);
					index += len;
				}
			}
			device.recv_total += device.recv_len;
			len = device.tran_len>device.recv_len ? device.tran_len : device.recv_len;
			device.error_len = len - compare_array(device.recv_buff,device.tran_buff,device.tran_len<device.recv_len ? device.tran_len : device.recv_len);
			if(device.error_len > 0){
				device.error_total += device.error_len;
				device.error_cnt++;
			}
			device.count++;
			PRINT_LOG(device.fd,"[%4d]  \t %4d Bytes  \t %4d Bytes  \t\t %4d Bytes\n",device.count,device.tran_len,device.recv_len,device.error_len);
			if(device.count >= device.total){
				break;
			}
		}
		PRINT_LOG(device.fd,"- - - - - - - - - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - \n");
		PRINT_LOG(device.fd,"Total number\tTotal send(Bytes)\tTotal receive(Bytes)\tTotal error(Bytes)\n");
		PRINT_LOG(device.fd,"[%4d/%-4d]\t%4d Bytes\t\t%4d Bytes\t\t%4d Bytes\n",device.error_cnt,device.count,device.tran_total,device.recv_total,device.error_total);
		//退出时发送一个传输结束符
		write_serial(&device.serial_dev,"\x04\x04\x04\x04\x04", 5);
		sleep(1);
	}
	PRINT_LOG(device.fd,"\n");
	serial_device_deinit(&device.serial_dev);
exit:
	if(device.fd > 0){
		close(device.fd);
	}
	return 0;
}









